﻿package ReadWriteXML;

import java.io.File;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


import android.util.Log;



public class WriteXML {


	/**
	 * This class construcs an XML document in memory using DOM.
	 * It first creates the root Order element and subsequently creates components
	 * of the order by inserting nodes to the root element.
	 */
	private static Document CreateOrderDOM(String root, Document doc)
	{
		DocumentBuilder builder = null;
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try
		{
			builder = factory.newDocumentBuilder();
			doc = builder.newDocument();

		}
		catch (ParserConfigurationException e)
		{
			e.printStackTrace();
		}                
		Element _root = doc.createElement(root);        
		doc.appendChild(_root);
		// Normalizing the DOM
		doc.getDocumentElement().normalize();
		return doc;
	}

	
	
	private static Document insertItemIP(Document doc, Node parent, int id, String ip)
	{
		// Insert child Item
		Element e = doc.createElement("Learner");
		parent.appendChild(e);

		e.setAttribute("ID", ""+id);
		Node nip = doc.createElement("IP");
		e.appendChild(nip);

		Node vaule = doc.createTextNode(ip);
		nip.appendChild(vaule);

		return doc;
	}

	/**
	 * 
	 * @param doc
	 * @param parent
	 * @param userName
	 * @param ip
	 * @param fullName
	 * @return
	 */
	private static Document insertItemIP(Document doc, Node parent, String userName, String ip, String fullName)
	{
		// Insert child Item
		Element e = doc.createElement("Learner");
		parent.appendChild(e);

		e.setAttribute("UserName", userName);

		//tạo node ip
		Node nodeChild = doc.createElement("IP");
		e.appendChild(nodeChild);

		Node vaule = doc.createTextNode(ip);
		nodeChild.appendChild(vaule);

		//tạo node fullname
		nodeChild = doc.createElement("FullName");
		e.appendChild(nodeChild);

		vaule = doc.createTextNode(fullName);
		nodeChild.appendChild(vaule);

		return doc;
	}


	private static Document insertItemTestList(Document doc, Node parent, String title, int idPart, int idDetailLearning, int idExercise, String fNameTest)
	{
		// Insert child Item
		Element e = doc.createElement("Test");
		parent.appendChild(e);

		e.setAttribute("IDPart", String.valueOf(idPart));
		e.setAttribute("IDDetailLearning", String.valueOf(idDetailLearning));
		e.setAttribute("IDExercise", String.valueOf(idExercise));
		//tạo node ip
		Node nodeChild = doc.createElement("NameTest");
		e.appendChild(nodeChild);

		Node vaule = doc.createTextNode(fNameTest);
		nodeChild.appendChild(vaule);

		//tạo node fullname
		nodeChild = doc.createElement("Title");
		e.appendChild(nodeChild);

		vaule = doc.createTextNode(title);
		nodeChild.appendChild(vaule);

		return doc;
	}
	
	/**
	 * Hàm tạo root cho Document, đây là hàm quan trọng, phải insert root rồi mới có thể insert các tag
	 * @param doc
	 * @param path
	 * @param root
	 * @return
	 */
	public static Document insertRoot(Document doc, String path, String root)
	{
		// Build new DOM Document
		doc = CreateOrderDOM(root, doc);
		//kiem tra fileName da ton tai hay chua
		File f = new File(path);
		if(!f.exists())
		{
			// Print XML content
			DOMUltil.printDOM(doc);

			// Write to a file
			DOMUltil.writeXmlToFile(path,doc);	             
		}  
		return doc;
	}

	/**
	 * Hàm tạo một tag kèm theo giá trị đi kèm
	 * @param doc
	 * @param path
	 * @param parent: là node cha
	 * @param tagName
	 * @param val
	 * @return
	 */
	public static Document insertVauleTagNode(Document doc, String path, Node parent, String tagName, String val)
	{
		//insert tag
		Node itemChild = doc.createElement(tagName);
		parent.appendChild(itemChild);

		Node value = doc.createTextNode(val);
		itemChild.appendChild(value);

		DOMUltil.writeXmlToFile(path, doc);
		return doc;
	}

	/**
	 * Hàm tạo một tag kèm theo giá trị đi kèm
	 * @param doc
	 * @param path
	 * @param parent: tên node cha
	 * @param tagName
	 * @param val
	 * @return
	 */
	public static Document insertValueTagNode(Document doc, String path, String parent, String tagName, String val)
	{
		//insert tag
		Node root = doc.getElementsByTagName(parent).item(0);
		Node itemChild = doc.createElement(tagName);
		root.appendChild(itemChild);

		Node value = doc.createTextNode(val);
		itemChild.appendChild(value);

		DOMUltil.writeXmlToFile(path,doc);
		return doc;

	}

	/**
	 * Hàm tạo một tag, không đi kèm giá trị
	 * @param doc
	 * @param path
	 * @param parent: tên node cha
	 * @param tagName
	 * @return
	 */
	public static Document insertTagNode(Document doc, String path, String parent, String tagName)
	{
		//insert tag
		Node root = doc.getElementsByTagName(parent).item(0);
		Node itemChild = doc.createElement(tagName);
		root.appendChild(itemChild);

		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	/**
	 * Hàm tạo một tag, không đi kèm giá trị
	 * @param doc
	 * @param path
	 * @param parent: là node cha
	 * @param tagName
	 * @return
	 */
	public static Document insertTagNode(Document doc, String path, Node parent, String tagName)
	{
		//insert tag
		Node itemChild = doc.createElement(tagName);
		parent.appendChild(itemChild);

		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	/**
	 * Hàm tạo một element đi kèm với các thuộc tính và giá trị của nó
	 * @param doc
	 * @param path
	 * @param parent: là node cha
	 * @param tagName
	 * @param attribute: mảng lưu tên các thuộc tính
	 * @param value: mảng lưu giá trị tương ứng của các thuộc tính
	 * @return
	 */
	public static Document insertTagElement(Document doc, String path, Node parent, String tagName, ArrayList<Object> attribute, ArrayList<Object> value)
	{
		//tao element tag
		Element e = doc.createElement(tagName);

		//khoi tao các giá trị attribute
		int n= attribute.size();
		for(int i = 0; i< n; i++)
			e.setAttribute(attribute.get(i).toString(), value.get(i).toString());

		parent.appendChild(e);
		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	
	public static Document insertTagElement(Document doc, String path, String parent, String tagName, ArrayList<Object> attribute, ArrayList<Object> value, ArrayList<Object> tagChildNode, ArrayList<Object> valueChildNode)
	{
		Node nparent = doc.getElementsByTagName(parent).item(0);
		//tao element tag
		Element e = doc.createElement(tagName);

		//khoi tao các giá trị attribute
		int n= attribute.size();
		for(int i = 0; i< n; i++)
			e.setAttribute(attribute.get(i).toString(), value.get(i).toString());

		nparent.appendChild(e);
		
		n = tagChildNode.size();
		for(int i = 0; i < n; i++)
		{
			Node child = doc.createElement(tagChildNode.get(i).toString());
			child.setTextContent(valueChildNode.get(i).toString());
			e.appendChild(child);
		}
		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}
	/**
	 * Hàm xoá một element dựa vào các thuộc tính và giá trị của nó
	 * @param doc
	 * @param path
	 * @param tagName
	 * @param attribute: mảng lưu tên các thuộc tính
	 * @param value: mảng lưu giá trị tương ứng của các thuộc tính
	 * @return
	 */
	public static Document deleteTagElement(Document doc, String path, String tag, ArrayList<Object> attribute, ArrayList<Object> value)
	{
		NodeList resList = doc.getElementsByTagName(tag);
		DOMUltil.printDOM(doc);
		int n = resList.getLength();
		boolean flag = true;
		int length = attribute.size();
		for(int i = 0; i< n; i++)
		{
			Element e = (Element)resList.item(i);
			for(int j = 0; j < length; j++)
				if(e.getAttribute(attribute.get(j).toString()).equals(value.get(j).toString()) == false)
				{	
					flag = false;
					break;
				}
			if(flag == true)
			{
				Node parent = e.getParentNode();
				parent.removeChild(e);
				break;
			}
			flag = true;
		}
		DOMUltil.writeXmlToFile(path,doc);
		//Element e = (Element)resList.item(index);
		return doc;
	}
	public static Document insertTagElement(Document doc, String path, Node parent, String tagName, String attribute, String value)
	{
		//tao element tag
		Element e = doc.createElement(tagName);

		//khoi tao các giá trị attribute
		e.setAttribute(attribute, value);

		parent.appendChild(e);
		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	/**
	 * Temp
	 * @param doc
	 * @param path
	 * @param parent
	 * @param tagName
	 * @param attribute
	 * @param value
	 * @param tagNode
	 * @param valueNode
	 * @return
	 */
	public static Document insertTagElement(Document doc, String path, String parent, String tagName, String attribute, Object value, String tagNode, String valueNode)
	{
		//tao element tag
		Element e = doc.createElement(tagName);

		//khoi tao các giá trị attribute
		e.setAttribute(attribute, value.toString());
		
		Node p = doc.getElementsByTagName(parent).item(0);
		p.appendChild(e);
		
		doc = insertVauleTagNode(doc, path, e, tagNode, valueNode);		
		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	public static Document deleteTagElement(Document doc, String path, String tag, String attribute, String value)
	{
		NodeList resList = doc.getElementsByTagName(tag);
		DOMUltil.printDOM(doc);
		int n = resList.getLength();
		for(int i = 0; i< n; i++)
		{
			Element e = (Element)resList.item(i);
			if(e.getAttribute(attribute).equals(value))
			{
				Log.d("PEERDROID","delete note");
				Node parent = e.getParentNode();
				parent.removeChild(e);
				break;
			}
		}
		DOMUltil.writeXmlToFile(path,doc);
		//Element e = (Element)resList.item(index);
		return doc;
	}
	
	
	/**
	 * Hàm insert thông tin học viên: ip và id
	 * @param doc
	 * @param path
	 * @param id
	 * @param ip
	 * @return
	 */
	public static Document insertIP(Document doc, String path, int id, String ip)
	{
		if(doc != null)
		{
			Node item = doc.getElementsByTagName("IPList").item(0);
			DOMUltil.printDOM(item);
			doc = insertItemIP(doc, item, id, ip);
			//DOMUtil1.writeXmlToFile(fileName,document);
		}

		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	/**
	 * Hàm insert thông tin học viên: userName, ip, fullName
	 * @param doc
	 * @param path
	 * @param userName
	 * @param ip
	 * @param fullName
	 * @return
	 */
	public static Document insertIP(Document doc, String path, String userName, String ip, String fullName)
	{
		if(doc != null)
		{
			Node item = doc.getElementsByTagName("LearnerList").item(0);
			DOMUltil.printDOM(item);
			doc = insertItemIP(doc, item, userName, ip, fullName);
			//DOMUtil1.writeXmlToFile(fileName,document);
		}
		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}

	/**
	 * ham insert  mot member xuong file xml
	 * @param doc
	 * @param path
	 * @param mem
	 * @return
	 */

			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
			
	

	public static Document insertTestList(Document doc, String path, String title, int idPart, int idDetailLearning, int idExercise, String fNameTest)
	{

		if(doc != null)
		{
			Node item = doc.getElementsByTagName("TestList").item(0);
			DOMUltil.printDOM(item);
			doc = insertItemTestList(doc, item, title, idPart, idDetailLearning, idExercise, fNameTest);
			//DOMUtil1.writeXmlToFile(fileName,document);
		}

		DOMUltil.writeXmlToFile(path,doc);
		return doc;
	}
	
		public static Document deleteIPFromUsername(Document doc, String fName, String sUsername)
	{
		if(doc != null)
		{
			NodeList resList = doc.getElementsByTagName("Learner");
			int n = resList.getLength();
			for(int i = 0; i< n; i++)
			{
				Element e = (Element)resList.item(i);
				if(e.getAttribute("UserName").equals(sUsername))
				{
					Node parent = e.getParentNode();
				  	parent.removeChild(e);
				}
			}					
		}
		DOMUltil.writeXmlToFile(fName,doc);
		return doc;
	}
	public static Document deleteIP(String fName, String ip)
	{
		Document doc = ReadXML.BuildXML(fName);
		if(doc != null)
		{
			NodeList ipList = doc.getElementsByTagName("Learner");
			int n = ipList.getLength();
			for(int i = 0; i< n; i++)
			{
				Node noteip = ipList.item(i);
				NodeList nip = noteip.getChildNodes(); 
				if(nip.item(0).getTextContent().equals(ip))
					noteip.getParentNode().removeChild(noteip);
			}
			
		}
		DOMUltil.writeXmlToFile(fName,doc);
		return doc;
	}
//	public static Document WriteQuestion(String path, ArrayList<ArrayList<String>> quesList)
//	{
//		Document doc = null;
//		doc = insertRoot(doc, path, "QuestionList");
//		int n = quesList.size();
//		for(int i = 0; i < n; i++)
//		{
//			Node root = doc.getElementsByTagName("QuestionList").item(0);
//			Node parent = doc.createElement("Question");
//			root.appendChild(parent);
//			
//			int type = Integer.valueOf(quesList.get(i).get(0));
//			
//			Node child = doc.createElement("Type");
//			parent.appendChild(child);
//			
//			Node value = doc.createTextNode(quesList.get(i).get(0));
//			child.appendChild(value);
//			
//			child = doc.createElement("Content");
//			parent.appendChild(child);
//			
//			value = doc.createTextNode(quesList.get(i).get(0));
//			child.appendChild(value);
//			
//			Node optList = doc.createElement("OptionList");
//			parent.appendChild(optList);
//			int length = quesList.get(i).size();
//			switch (type) {
//			case 5:
//			{
//				for(int j = 0; j< length; j++)
//				{
//					child = doc.createElement("Option");
//					parent.appendChild(child);
//
//					value = doc.createTextNode(quesList.get(i).get(2+j));
//					child.appendChild(value);
//				}
//				break;
//			}
//			default:
//			{
//				for(int j = 0; j< length; j+=2)
//				{
//					Element e = doc.createElement("Option");
//					optList.appendChild(e);
//					
//					e.setAttribute("isAnswer", quesList.get(i).get(2+j));
//					e.setTextContent(quesList.get(i).get(2+j));
//				}
//				break;	
//			}
//			}
//			
//		}
//		return doc;
//	}
}

